SenseMyFEUP data

Data loading

Data is filtered by travelmode (car and bus) and date (April 2016).

Intersession times

Visualizing intersession times

All intersession time

Intersession time along the week

We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`

Histogram intersession time.

We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`

Number of sessions per way_id

We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`

Filtering by sessions per way_id

ECDF

ECDF by #sessions

Lowest 35%

We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
ggplotly(c1) 
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Removed 248 rows containing non-finite values (stat_bin).

Top 10% points

Map points April 2016

Showing maps

Traffic Map April Porto 2016 all

Traffic Map April 2016 all >50

Traffic day Map April 2016

Traffic night Map April 2016

Top 12 edges

Map Intersession time all 1.30h.

Map Intersession time (<1.3h) day.

Map Intersession time (<2h)night.

By date >50

Speeds >50

# Speed by way_id and session.\
avg_speed_wayid <- df_speed %>% 
  subset(way_id %in% df_hotedges_april16pt$way_id) %>% 
  group_by(way_id) %>% 
  summarise(avg_speed = mean((speed*18)/5), n = n() )

ggplot(avg_speed_wayid, aes(avg_speed)) +
  geom_histogram(binwidth = 5) + 
  scale_x_continuous(name = "Avg_speed(km/h)",  breaks = seq(0, 150, 10) )

Speed by week

Speed by day

Speed by hour

Number of session per hour

Ways_ids per half hour

Time serie per way_id

df_superhotedges_april16pt %>% 
  filter( way_id == list_osm_edge[2] ) %>% 
  plot_ly(x= ~time, y= ~(speed*18)/5, color = ~class) %>% 
  layout(title = paste("Time series of speed for way_id",list_osm_edge[2], sep = " " ),yaxis = list(title="Speed (km/h)"),
         xaxis = list(title="Date"))
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
minimal value for n is 3, returning requested palette with 3 different levels
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
minimal value for n is 3, returning requested palette with 3 different levels
LS0tCnRpdGxlOiAnU2Vuc2UgTXkgRkVVUCAtIEFwcmlsIDIwMTYgRGF0YScKYXV0aG9yOiAiRGFuaWVsYSBTLiBHaWwiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIGVjaG8gPSBGQUxTRSwgZXZhbD1GQUxTRX0Kc2F2ZS5pbWFnZSgiU2Vuc2VteVdvcmtTcGFjZS5SRGF0YSIpCiNsb2FkKCJkZl9maXJzdF9zZXNzaW9uX2NhcnNfYXByaWwxNi5SZGEiKQpsb2FkKCJTZW5zZW15V29ya1NwYWNlLlJEYXRhIikKCmBgYAoKCiMgU2Vuc2VNeUZFVVAgZGF0YQojIyBEYXRhIGxvYWRpbmcKIERhdGEgaXMgZmlsdGVyZWQgYnkgdHJhdmVsbW9kZSAoY2FyIGFuZCBidXMpIGFuZCBkYXRlIChBcHJpbCAyMDE2KS4gICAgICAKCmBgYHtyIGVjaG89RkFMU0V9CiNGaWx0ZXJpbmcgYnkgcmVjdGFuZ2xlIGluIFBvcnRvIAoKZGZfZWRnZXNfYXByaWwxNiA8LSBkZl9zcGVlZAoKZGZfZWRnZXNfYXByaWwxNnB0IDwtIGRmX3NwZWVkICU+JSAKICBmaWx0ZXIobGF0IDwgNDEuMTg1OTM1MjgwODE1NSwgbGF0ID4gNDEuMTM2NDcyNjU0NiwgbG9uID4gLTguNjkxMjk0MDY4MTQwNSwgbG9uIDwgLTguNTUzOTY5MzQyMjgpCmBgYAoKIyMgSW50ZXJzZXNzaW9uIHRpbWVzCgojIyMgVmlzdWFsaXppbmcgaW50ZXJzZXNzaW9uIHRpbWVzCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CgojR2V0dGluZyBkYXRhIGZyb20gZGZfc3BlZWQKCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgPC0gZGZfZWRnZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQsIHNlc3Npb25faWQpICU+JSAKICBzdW1tYXJpc2Uoc2Vjb25kcyA9IG1pbihzZWNvbmRzKSkKCiMgVHJhbnNmb3JtaW5nIHNlY29uZHMgdG8gdGltZXN0YW1wIGFuZCBjYWxjdWxhdGluZyBpbnRlcnNlc3Npb24gdGltZS4KCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkdGltZSA8LSBhcy5QT1NJWGN0KGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkc2Vjb25kcywgb3JpZ2luPSIxOTcwLTAxLTAxIikKZGZfZWRnZXNfYXByaWwxNnB0JHRpbWUgPC0gYXMuUE9TSVhjdChkZl9lZGdlc19hcHJpbDE2cHQkc2Vjb25kcywgb3JpZ2luPSIxOTcwLTAxLTAxIikKCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAgJT4lCiAgYXJyYW5nZShkZXNjKHdheV9pZCksIHRpbWUpICU+JSAKICBtdXRhdGUoaW50ZXJzZXNzaW9uX3RpbWUgPSBjKDAsYXMubnVtZXJpYyhkaWZmKHRpbWUpLCB1bml0cz0ibWlucyIpKSkKCiMgUmVtb3ZlIE1pbiBjb2x1bW4KIyBkZl9pbnRlcnNlc3Npb25fYXByaWwkbWluIDwtIE5VTEwgCmBgYAoKQWxsIGludGVyc2Vzc2lvbiB0aW1lIApgYGB7ciBlY2hvPUZBTFNFfQpwbG90X2x5KHkgPSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0JGludGVyc2Vzc2lvbl90aW1lLCB0eXBlID0gImJveCIsIG5hbWUgPSAiQWxsIHdheV9pZHMiKSAlPiUgCiAgYWRkX2JveHBsb3QoeT0gZmlsdGVyKGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGludGVyc2Vzc2lvbl90aW1lID4gMCApJGludGVyc2Vzc2lvbl90aW1lLCBuYW1lID0gIkF0IGxlYXN0IDIgc2Vzc2lvbnMiKSAlPiUgCiAgbGF5b3V0KHRpdGxlPSJJbnRlcnNlc3Npb24gdGltZSAobWlucykiLCB5YXhpcyA9IGxpc3QocmFuZ2UgPSBjKDAsNTAwMCkpKQoKYGBgCgpJbnRlcnNlc3Npb24gdGltZSBhbG9uZyB0aGUgd2VlayAKYGBge3IgZWNobz1GQUxTRX0KcCA8LSBnZ3Bsb3QoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCwgYWVzKHggPSB3ZWVrZGF5cyh0aW1lKSwgeSA9IGludGVyc2Vzc2lvbl90aW1lLCBmaWxsID0gaW50ZXJhY3Rpb24od2Vla2RheXModGltZSkpICkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICB4bGFiKCJEYXlzIG9mIHRoZSB3ZWVrIiApICsKICB5bGFiKCJJbnRlcnNlc3Npb24gdGltZSAobWlucykiKSArCiAgZ2d0aXRsZSgiSW50ZXJzZXNzaW9uIHRpbWUobWluKSBpbiB0aGUgd2VlayAiKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiRG9taW5nbyIsICJTZWd1bmRhIiwgIlRlcsOnYSIsICJRdWFydGEiLCAiUXVpbnRhIiwgCiAgICAiU2V4dGEiLCAiU8OhYmFkbyIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwMDApKQoKCnAgPC0gcGxvdGx5X2J1aWxkKHApCnAKCmBgYAoKSGlzdG9ncmFtIGludGVyc2Vzc2lvbiB0aW1lLgpgYGB7ciBlY2hvPUZBTFNFfQoKaW50MiA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JQogIGZpbHRlcihpbnRlcnNlc3Npb25fdGltZSA+IDApICU+JSAKICBnZ3Bsb3QoYWVzKGludGVyc2Vzc2lvbl90aW1lLzYwKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDkpICsgCiAgZ2d0aXRsZSgiSW50ZXJzZXNzaW9uIHRpbWUgKGhvdXJzKSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbT1jKDAsMzAwKSkKaW50MiA8LSBnZ3Bsb3RseShpbnQyKQoKaW50MyA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JQogIGZpbHRlcihpbnRlcnNlc3Npb25fdGltZSA+IDApICU+JSAKICBnZ3Bsb3QoYWVzKGludGVyc2Vzc2lvbl90aW1lLzYwKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwyNSkpCmludDMgPC0gZ2dwbG90bHkoaW50MykKCnN1YnBsb3QoaW50MixpbnQzLCBucm93cyA9IDIpCmBgYAoKTnVtYmVyIG9mIHNlc3Npb25zIHBlciB3YXlfaWQKCmBgYHtyIGVjaG89RkFMU0UsICBtZXNzYWdlPUZBTFNFfQppbnQxIDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbigpKSAlPiUgIAogIGdncGxvdChhZXMoeCA9bl9zZXNzaW9ucykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsMTUwKSkgKwogIGdndGl0bGUoIk51bWJlciBvZiBzZXNzaW9ucyBwZXIgd2F5X2lkIGluIFBvcnRvIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDUwLCBzaXplID0gMSwgY29sb3VyID0gIiNGRjM3MjEiLAogICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIikKCmdncGxvdGx5KGludDEpCmBgYAoKIyMjIEZpbHRlcmluZyBieSBzZXNzaW9ucyBwZXIgd2F5X2lkIAoKYGBge3IgZWNobz1GQUxTRX0KI0NyZWF0ZSBkZiB3aXRoIHdheV9pZHMgd2l0aCA+NTAgc2Vzc2lvbnMKCmRmX2lkX2hvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lICAKICBmaWx0ZXIobl9zZXNzaW9ucyA+PSAyMDApIAoKZGZfaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2lkX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgbWVyZ2UoeT0gZGZfZWRnZXNfYXByaWwxNnB0LCBieT0id2F5X2lkIikKCmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2lkX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgbWVyZ2UoeT0gZGZfZWRnZXNfYXByaWwxNnB0LCBieT0id2F5X2lkIikKCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0gCiMgUE9JTlRTIGZvciBtYXBwaW5nCgojQWxsIHdpdGggc2Vzc2lvbnMgPiA1MApkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbigpKSAlPiUgCiAgZmlsdGVyKG5fc2Vzc2lvbnMgPj0gMjAwKSAlPiUgCiAgbWVyZ2UoIHkgPSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCBieSA9ICJ3YXlfaWQiKSAKCmRmX3BvaW50c19zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lIAogIGZpbHRlcihuX3Nlc3Npb25zID49IDIwMCkgJT4lIAogIG1lcmdlKCB5ID0gZGZfcG9pbnRzX2VkZ2Vfb3NtX2FwcmlsMTZwdCwgYnkgPSAid2F5X2lkIikgCgoKZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgPC1tdXRhdGUoZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQsIGNsYXNzID0gaWZlbHNlKGhvdXIodGltZSkgPj03ICYgaG91cih0aW1lKSA8PSAyMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAibmlnaHQiKSkKCgojRGF5CmRmX3BvaW50c19ob3RlZGdlc19hcHJpbDE2cHRfZCA8LSBkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcihob3VyKHRpbWUpID49NywgaG91cih0aW1lKTw9IDIwLCBuX3Nlc3Npb25zID49IDUwKSAlPiUgCiAgbWVyZ2UoIHkgPSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCBieSA9ICJ3YXlfaWQiKSAKCiMgTmlnaHQKZGZfcG9pbnRzX2FwcmlsMTZwdF9uaWdodF9uIDwtIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKGhvdXIodGltZSkgPDcgfCBob3VyKHRpbWUpID4gMjAsIG5fc2Vzc2lvbnMgPj0gMjApICU+JSAKICBtZXJnZSggeSA9IGRmX3BvaW50c19lZGdlX29zbV9hcHJpbDE2cHQsIGJ5ID0gIndheV9pZCIpIAoKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0IDwtIG11dGF0ZShkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBjbGFzcyA9IGlmZWxzZShob3VyKHRpbWUpID49NyAmIGhvdXIodGltZSkgPD0gMjAsIAogICAgICAgICAgICAgICAgICAgICAgICAiZGF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5pZ2h0IikpCiAgCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CiNOZWNlc3NhcnkgZm9yIG1hcHBpbmcgCgojUmVvcmRlciBjb2x1bW5zCmRmX29zbV9lZGdlIDwtIGRmX3BvaW50c19ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIHNlbGVjdCh3YXlfaWQsIHBvaW50cykKCmRmX29zbV9lZGdlIDwtIGRmX3BvaW50c19zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgc2VsZWN0KHdheV9pZCwgcG9pbnRzKQoKI0xpc3QgYmVmb3JlIHBhc3NpbmcgdG8gbWFwLgpsaXN0X29zbV9lZGdlIDwtIGRmX29zbV9lZGdlWywgMV0KCmBgYAoKIyMjIEVDREYgCmBgYHtyIGVjaG89RkFMU0V9CmUxIDwtIGdncGxvdChzdWJzZXQoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCwgaW50ZXJzZXNzaW9uX3RpbWUgPiAwKSwgYWVzKGludGVyc2Vzc2lvbl90aW1lKSkgKyAKICBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgKwogIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lKG1pbnMpIikKCmUyIDwtIGdncGxvdChzdWJzZXQoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCwgaW50ZXJzZXNzaW9uX3RpbWUgPiAwKSwgYWVzKGludGVyc2Vzc2lvbl90aW1lKSkgKyAKICBzY2FsZV94X2xvZzEwKCkgK3N0YXRfZWNkZihnZW9tID0gInN0ZXAiKSAgKyB4bGFiKCJJbnRlcnNlc3Npb24gdGltZSBMb2ciKQoKZ3JpZC5hcnJhbmdlKGUxLCBlMiwgbmNvbD0gMiwgdG9wID0gIkludGVyc2Vzc2lvbiB0aW1lIGFsbCBzZXNzaW9ucyBQb3J0byAobWlucykiKQpgYGAKIApgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQplMyA8LSAgZ2dwbG90KGRmX2hvdGVkZ2VzX2FwcmlsMTZwdF9kYXksIGFlcyhhdmdfaXRtKSkgKyAKICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IHNlcSgwLDEwMDAsMjAwKSkgKwogIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSAgKyAKICB4bGFiKCIgTG9nIEludGVyc2Vzc2lvbiB0aW1lKG1pbikiKSAKICAKZTQgPC0gIGdncGxvdChkZl9ob3RlZGdlc19hcHJpbDE2cHRfbmlnaHQsIGFlcyh4ID0gYXZnX2l0bSkpICsgCiAgc2NhbGVfeF9sb2cxMChicmVha3MgPSBzZXEoMCwxMDAwLDIwMCkpICsKICBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgICsKICB4bGFiKCIgTG9nIEludGVyc2Vzc2lvbiB0aW1lKG1pbikiKSAKCmdyaWQuYXJyYW5nZShlMywgZTQsIG5jb2w9IDIsIHRvcCAgPSAiRUNERiBBdmVyYWdlIEludGVyc2Vzc2lvbiB0aW1lIGRheSg+NTApICIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0KIyBDbGFzc2lmeWluZyBwb2ludHMgYnkgZGF5IGZvciBFQ0RGIApkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0IDwtbXV0YXRlKGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGNsYXNzID0gaWZlbHNlKGhvdXIodGltZSkgPj03ICYgaG91cih0aW1lKSA8PSAyMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAibmlnaHQiKSkKCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGZpbHRlcihpbnRlcnNlc3Npb25fdGltZSA+MCkgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgZ2dwbG90KCBhZXMoaW50ZXJzZXNzaW9uX3RpbWUsIGNvbG9yPSBjbGFzcyApKSArIAogIHNjYWxlX3hfbG9nMTAoKSArIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArIAogIGdndGl0bGUoIkludGVyc2Vzc2lvbiB0aW1lID41MCBzZXNzaW9ucyBQb3J0byIpCmBgYAoKCmBgYHtyICBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRSB9CkVDREYgYWxsIGJ5ICNwb2ludHMgCmVjZGZfYWxsIDwtIGdncGxvdChkZl9vc21fZWRnZSwgYWVzKHBvaW50cykpICsgCiAgc2NhbGVfeF9sb2cxMCgpICsgc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICsgeGxhYigiQWxsIHBvaW50cyIpCgplY2RmX2RheTwtIGdncGxvdChkZl9vc21fZWRnZSwgYWVzKHBvaW50cykpICsgCiAgc2NhbGVfeF9sb2cxMCgpICsgc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICsgdGl0bGUoIkVDREYgZGF5IikrIHhsYWIoIlBvaW50cyBhdCBkYXkiKQoKZWNkZl9uaWdodCA8LSBnZ3Bsb3QoZGZfb3NtX2VkZ2UsIGFlcyhwb2ludHMpKSArIAogIHNjYWxlX3hfbG9nMTAoKSArIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArIHRpdGxlKCJFQ0RGIG5pZ2h0IikrIHhsYWIoIlBvaW50cyBhdCBuaWdodCIpCgpncmlkLmFycmFuZ2UoZWNkZl9hbGwsZWNkZl9kYXksZWNkZl9uaWdodCwgIG5jb2w9MykKCmBgYAoKCkVDREYgYnkgI3Nlc3Npb25zIAoKYGBge3IgZWNobz1GQUxTRX0KZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkKSAlPiUgCiAgc3VtbWFyaXNlKHNlc3Npb25zID0gbigpICkgJT4lIAogIGdncGxvdChhZXMoc2Vzc2lvbnMpKSArIAogIHNjYWxlX3hfbG9nMTAoKSArIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArCiAgZ2d0aXRsZSgiRUNERiBudW1iZXIgb2Ygc2Vzc2lvbnMgYWxsIFBvcnRvIikKICAKYGBgCgojIyMgTG93ZXN0IDM1JSAKCgpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9CmxvdzEgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBzdWJzZXQoIGludGVyc2Vzc2lvbl90aW1lIDwgcXVhbnRpbGUoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCRpbnRlcnNlc3Npb25fdGltZSwgMC4zNSkpICU+JSAKICBnZ3Bsb3QoYWVzKGludGVyc2Vzc2lvbl90aW1lKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjAwLDEwKSkrCiAgeGxhYigiSW50ZXJzZXNzaW9uIHRpbWUgKG1pbnMpIikgKyAKICBnZ3RpdGxlKCJMb3dlc3QgMzUlIGludGVyc2Vzc2lvbiB0aW1lID41MCIpCgpnZ3Bsb3RseShsb3cxKQpgYGAKCgpgYGB7cn0KYzEgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBnZ3Bsb3QoYWVzKGludGVyc2Vzc2lvbl90aW1lLCBmaWxsID0gY2xhc3MpKSArIAogIGdlb21faGlzdG9ncmFtKCkgKyAKICB4bGFiKCJJbnRlcnNlc3Npb24gdGltZSAobWluKSIpICsKICB4bGltKGMoMCwzMDAwKSkgKwogIHlsaW0oYygwLDUwMDApKSArCiAgZ2d0aXRsZSgiSW50ZXJzZXNzaW9uIHRpbWUgPjUwIGRheS9uaWdodCIpCgpnZ3Bsb3RseShjMSkgCmBgYAoKCgpUb3AgMTAlIHBvaW50cwpgYGB7ciBlY2hvID0gRkFMU0UsIGV2YWw9VFJVRX0Kc3VtbWFyeShkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0JHBvaW50cykKcXVhbnRpbGUoZGZfcG9pbnRzX2hvdGVkZ2VzX2FwcmlsMTZwdCRwb2ludHMsIDAuOTApCgogYm94cGxvdChkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0JHBvaW50cykgIAoKCmBgYAoKCiMjIE1hcCBwb2ludHMgQXByaWwgMjAxNgoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0KIyBDcmVhdGluZyB0aGUgZW1wdHkgbWFwIG9mIFBvcnRvCgojUG9pbnRzCiNib3hwbG90KGRmX29zbV9lZGdlJHBvaW50cykKCmZldXAgPC0gICBxdWFudGlsZShkZl9vc21fZWRnZSRwb2ludHMsIDAuOSkKc3VwZXJpb3IgPC0gcXVhbnRpbGUoZGZfb3NtX2VkZ2UkcG9pbnRzLCAwLjcpCm1lZGlvIDwtIHF1YW50aWxlKGRmX29zbV9lZGdlJHBvaW50cywgMC41KQpsb3cgPC0gcXVhbnRpbGUoZGZfb3NtX2VkZ2UkcG9pbnRzLCAwLjUpCmxvdyA8LSAwCgptIDwtIGxlYWZsZXQoKSAlPiUgc2V0Vmlldyhsbmc9LTguNjE0MTksIGxhdD00MS4xNjMxMSwgem9vbSA9IDEzKQptIDwtIGFkZFRpbGVzKG0pIAptIDwtIGFkZFByb3ZpZGVyVGlsZXMobSwgIkNhcnRvREIuUG9zaXRyb24iKQoKCmNvdW50ZXIgPC0gMQoKZm9yKHdheV9pZCBpbiBsaXN0X29zbV9lZGdlKSB7CiAgCiAgZGZfd2F5X2lkIDwtIGRiR2V0UXVlcnkoY29uX29zbSwgcGFzdGUwKCJTRUxFQ1Qgc3RfYXN0ZXh0KHN0X3RyYW5zZm9ybSh3YXksIDQzMjYpKSBBUyBsaW5lIEZST00gcGxhbmV0X29zbV9saW5lIFdIRVJFIHBsYW5ldF9vc21fbGluZS5vc21faWQgPSAiLCB3YXlfaWQpKQogIAogIGxpbmUgPC0gZGZfd2F5X2lkJGxpbmUKICBsaW5lIDwtIGFzLmNoYXJhY3RlcihsaW5lKQogIAogIGxpbmUgPC0gdW5saXN0KHN0cnNwbGl0KGxpbmUsIHNwbGl0PScoJywgZml4ZWQ9VFJVRSkpWzJdCiAgbGluZSA8LSBzdWJzdHIobGluZSwgMSwgbmNoYXIobGluZSkgLSAxKQogIAogIHBhcnNlZF9saW5lIDwtIHN0cnNwbGl0KGxpbmUsICIsIikKICAKICBsb25zIDwtIGMoKQogIGxhdHMgPC0gYygpCiAgCiAgaWYobGVuZ3RoKHBhcnNlZF9saW5lKSAhPSAwKSB7CiAgICAKICAgICNEZWZpbmluZyBsb25zIGFuZCBsYXRzIGFzIHZhcmlhYmxlcyB0byB1c2UgbGF0ZXIuCgogICAgZm9yKGNvb3JkIGluIHBhcnNlZF9saW5lW1sxXV0pIHsKICAgICAgCiAgICAgIGxvbiA8LSB1bmxpc3Qoc3Ryc3BsaXQoY29vcmQsIHNwbGl0PScgJywgZml4ZWQ9VFJVRSkpWzFdCiAgICAgIGxhdCA8LSB1bmxpc3Qoc3Ryc3BsaXQoY29vcmQsIHNwbGl0PWxvbiwgZml4ZWQ9VFJVRSkpWzJdCiAgICAgIGxhdCA8LSBzdWJzdHIobGF0LCAyLCBuY2hhcihsYXQpKQogICAgICAKICAgICAgbG9uIDwtIGFzLm51bWVyaWMobG9uKQogICAgICBsYXQgPC0gYXMuZG91YmxlKGxhdCkKICAgICAgCiAgICAgIGxvbnMgPC0gYyhsb25zLCBsb24pCiAgICAgIGxhdHMgPC0gYyhsYXRzLCBsYXQpCiAgICAgIAogICAgfQogICAgCiAgICAjIERlY2lkaW5nIHRoZSBjb2xvciBvZiB0aGUgcG9pbnQuCgogICAgaWYoZGZfb3NtX2VkZ2VbY291bnRlciwgMl0gPiBmZXVwKSB7CiAgICAgICAgICAKICAgICAgICAgIG0gPC0gYWRkUG9seWxpbmVzKG0sIGxvbnMsIGxhdHMsIGNvbG9yPSdibHVlJywgcG9wdXAgPSBwYXN0ZSgiIiwgd2F5X2lkLCBzZXAgPSAiIikpIAogICAgCiAgICAgICAgfSBlbHNlIGlmIChkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA+PSBzdXBlcmlvciAmJiBkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA8PSBmZXVwKSB7CiAgICAgICAgICAKICAgICAgICAgIG0gPC0gYWRkUG9seWxpbmVzKG0sIGxvbnMsIGxhdHMsIGNvbG9yPSdyZWQnLCBwb3B1cCA9IHBhc3RlKCIiLCB3YXlfaWQsIHNlcCA9ICIiKSkgIAogICAgICAgIAogICAgICAgIH0gZWxzZSBpZiAoZGZfb3NtX2VkZ2VbY291bnRlciwgMl0gPj0gbWVkaW8gJiYgZGZfb3NtX2VkZ2VbY291bnRlciwgMl0gPD0gc3VwZXJpb3IpIHsKICAgICAgICAgIAogICAgICAgICAgbSA8LSBhZGRQb2x5bGluZXMobSwgbG9ucywgbGF0cywgY29sb3I9J3llbGxvdycsIHBvcHVwID0gcGFzdGUoIiIsIHdheV9pZCwgc2VwID0gIiIpKQogICAgICAgICAgCiAgICAgICAgfSBlbHNlIGlmIChkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA+PSBsb3cgJiYgZGZfb3NtX2VkZ2VbY291bnRlciwgMl0gPD0gbWVkaW8pIHsKICAgICAgICAgIAogICAgICAgICAgbSA8LSBhZGRQb2x5bGluZXMobSwgbG9ucywgbGF0cywgY29sb3I9J2dyZWVuJywgcG9wdXAgPSBwYXN0ZSgiIiwgd2F5X2lkLCBzZXAgPSAiIikpCiAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY291bnRlciA8LSBjb3VudGVyICsgMSAKICAgICAgICAKICAgICAgfQogICAgICAKICAgICAgI2NvbnRlbnQgPC0gcGFzdGUoInciLCB3YXlfaWQsIHNlcCA9ICIiKQogICAgICAjbSA8LSBhZGRQb3B1cHMobSwgbG9ucywgbGF0cywgY29udGVudCwgb3B0aW9ucyA9IHBvcHVwT3B0aW9ucyhjbG9zZUJ1dHRvbiA9IFRSVUUpKQogICAgICAjbSA8LSBhZGRMYWJlbE9ubHlNYXJrZXJzKG0sIGxvbnMsbGF0cywgbGFiZWwgPSBwYXN0ZSgiIiwgd2F5X2lkLCBzZXAgPSAiIiksIAogICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucyhub0hpZGUgPSBGLCB0ZXh0c2l6ZSA9ICIxNXB4IikpCiAgICAgICNwcmludChsaW5lKQogICAgCiAgICB9CgpgYGAKIyMjIFNob3dpbmcgbWFwcyAKClRyYWZmaWMgIE1hcCBBcHJpbCBQb3J0byAyMDE2IGFsbApgYGB7ciBldmFsPSBUUlVFfQojIFNob3dpbmcgTWFwLgptMSA8LSBtCm0xCiNtYXBzaG90KG0sIHVybCA9IHBhc3RlMChnZXR3ZCgpLCAiL21hcC5odG1sIikpCmBgYAoKVHJhZmZpYyAgTWFwIEFwcmlsIDIwMTYgYWxsID41MApgYGB7ciBlY2hvPUZBTFNFfQptXzUwIDwtIG0KbV81MCAKYGBgCgpUcmFmZmljIGRheSBNYXAgQXByaWwgMjAxNgpgYGB7ciBlY2hvPUZBTFNFfQptXzUwX2RheSA8LSBtCm1fNTBfZGF5CmBgYAoKVHJhZmZpYyBuaWdodCBNYXAgQXByaWwgMjAxNgpgYGB7ciBlY2hvPUZBTFNFfQptXzIwX25pZ2h0IDwtIG0KbV8yMF9uaWdodApgYGAKClRvcCAxMiBlZGdlcyAKCmBgYHtyIGVjaG89RkFMU0V9Cm1faG90IDwtIG0KbV9ob3QKYGBgCgoKTWFwIEludGVyc2Vzc2lvbiB0aW1lIGFsbCAxLjMwaC4KYGBge3IgZWNobz1GQUxTRX0KbV9pdG0gPC0gbQptX2l0bQpgYGAKCk1hcCBJbnRlcnNlc3Npb24gdGltZSAoPDEuM2gpIGRheS4KYGBge3IgZWNobz1GQUxTRX0KbV9pdG1fZGF5IDwtIG0KbV9pdG1fZGF5CiNtYXBzaG90KG1fbmlnaHRfc2Vtc2Vzc2lvbnMsIGZpbGUgPSAifi9tYXBzL3RvcF9pbnRlcnNlc3Npb25zX25pZ2h0X2FwcmlsLnBuZyIpCmBgYApNYXAgSW50ZXJzZXNzaW9uIHRpbWUgKDwyaCluaWdodC4KYGBge3IgZWNobz1GQUxTRX0KbV9pdG1fbmlnaHQgPC0gbQptX2l0bV9uaWdodAojbWFwc2hvdChtLCBmaWxlID0gIn4vbWFwcy9fYWxsX2FwcmlsLnBuZyIpCmBgYAoKCgoKIyMgQnkgZGF0ZSA+NTAKCmBgYHtyIGVjaG89IEZBTFNFfSAKZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBncm91cF9ieSh3ZWVrZGF5ID13ZGF5KHRpbWUpKSAlPiUgCiAgc3VtbWFyaXNlKHdheV9pZHMgPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHdlZWtkYXksd2F5X2lkcykpICsgCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiRG9taW5nbyIsICJTZWd1bmRhIiwgIlRlcsOnYSIsICJRdWFydGEiLCAiUXVpbnRhIiwgCiAgICAiU2V4dGEiLCAiU8OhYmFkbyIpKQoKYGBgCgpgYGB7ciBlY2hvPSBGQUxTRX0KZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBncm91cF9ieShkYXkgPWRheSh0aW1lKSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyhkYXksbikpICsgCiAgZ2VvbV9saW5lKCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEsMzAsMSkpCgpgYGAKCmBgYHtyIGVjaG89IEZBTFNFfSAKZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBncm91cF9ieShob3VyID1ob3VyKHRpbWUpKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKGhvdXIsbikpICsgCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwyMywxKSkKCmBgYAoKIyMgU3BlZWRzID41MAoKYGBge3J9CiMgU3BlZWQgYnkgd2F5X2lkIGFuZCBzZXNzaW9uLlwKYXZnX3NwZWVkX3dheWlkIDwtIGRmX3NwZWVkICU+JSAKICBzdWJzZXQod2F5X2lkICVpbiUgZGZfaG90ZWRnZXNfYXByaWwxNnB0JHdheV9pZCkgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShhdmdfc3BlZWQgPSBtZWFuKChzcGVlZCoxOCkvNSksIG4gPSBuKCkgKQoKZ2dwbG90KGF2Z19zcGVlZF93YXlpZCwgYWVzKGF2Z19zcGVlZCkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQXZnX3NwZWVkKGttL2gpIiwgIGJyZWFrcyA9IHNlcSgwLCAxNTAsIDEwKSApCmBgYAoKU3BlZWQgYnkgd2VlayAKYGBge3IgZWNobz1GQUxTRX0KZGZfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3ZWVrZGF5ID13ZGF5KHRpbWUpKSAlPiUgCiAgc3VtbWFyaXNlKGF2Z19zcGVlZCA9IG1lYW4oKHNwZWVkKjE4KS81KSkgJT4lIAogIGdncGxvdChhZXMod2Vla2RheSwgYXZnX3NwZWVkKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJEb21pbmdvIiwgIlNlZ3VuZGEiLCAiVGVyw6dhIiwgIlF1YXJ0YSIsICJRdWludGEiLCAKICAgICJTZXh0YSIsICJTw6FiYWRvIikpICsKICB5bGFiKCJBdmcgc3BlZWQga20vaCIpCmBgYAoKU3BlZWQgYnkgZGF5CgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KGRheSA9ZGF5KHRpbWUpKSAlPiUgCiAgc3VtbWFyaXNlKGF2Z19zcGVlZCA9IG1lYW4oKHNwZWVkKjE4KS81KSkgJT4lIAogIGdncGxvdChhZXMoZGF5LCBhdmdfc3BlZWQpKSArIAogIGdlb21fbGluZSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMzAsMSkpKwogIHlsYWIoIkF2ZyBzcGVlZCBrbS9oIikKYGBgCgpTcGVlZCBieSBob3VyCmBgYHtyIGVjaG89RkFMU0V9CmRmX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkoaG91ciA9aG91cih0aW1lKSkgJT4lIAogIHN1bW1hcmlzZShhdmdfc3BlZWQgPSBtZWFuKChzcGVlZCoxOCkvNSkpICU+JSAKICBnZ3Bsb3QoYWVzKGhvdXIsIGF2Z19zcGVlZCkpICsgCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwyMywxKSkrCiAgeWxhYigiQXZnIHNwZWVkIGttL2giKQpgYGAKCk51bWJlciBvZiBzZXNzaW9uIHBlciBob3VyCmBgYHtyIGVjaG89RkFMU0V9CmRmX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgICBncm91cF9ieShob3VyID1ob3VyKHRpbWUpKSAlPiUgCiAgICBzdW1tYXJpc2Uoc2Vzc2lvbnMgPSBuX2Rpc3RpbmN0KHNlc3Npb25faWQpKSAlPiUgCiAgZ2dwbG90KGFlcyhob3VyLCBzZXNzaW9ucykpICsgCiAgZ2VvbV9saW5lKCkrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDIzLDEpKQpgYGAKCldheXNfaWRzIHBlciBoYWxmIGhvdXIKYGBge3J9CnBydWViYSA8LSB0YWJsZShjdXQoZmlsdGVyKGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCwgZGF5KHRpbWUpIDwgNykkdGltZSwgYnJlYWtzID0gIjMwIG1pbnMiKSkKcGxvdChwcnVlYmEsIHhsYWIgPSAiZGF0ZSIsIHlsYWIgPSAiZnJlcXVlbmN5IikgCmBgYAoKIyMgVGltZSBzZXJpZSBwZXIgd2F5X2lkIAoKYGBge3IgZWNobz1GQUxTRX0KZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlciggd2F5X2lkID09IGxpc3Rfb3NtX2VkZ2VbM10gKSAlPiUgCiAgcGxvdF9seSh4PSB+dGltZSwgeT0gfihzcGVlZCoxOCkvNSwgY29sb3IgPSB+Y2xhc3MpICU+JSAKICBsYXlvdXQodGl0bGUgPSBwYXN0ZSgiVGltZSBzZXJpZXMgb2Ygc3BlZWQgZm9yIHdheV9pZCIsbGlzdF9vc21fZWRnZVszXSwgc2VwID0gIiAiICkseWF4aXMgPSBsaXN0KHRpdGxlPSJTcGVlZCAoa20vaCkiKSwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlPSJEYXRlIikpCgpgYGAKCmBgYHtyfQpmaWx0ZXIoZGZfaG90ZWRnZXNfYXByaWwxNnB0LCB3YXlfaWQgPT0gMzcxNDE5NjcgKSAlPiUgCiAgZ3JvdXBfYnkoZGF5KHRpbWUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PSB0aW1lLCB5PSAoc3BlZWQqMTgpLzUpKSArIAogIGdlb21fbGluZSgpCmBgYAoKCgoK